 /*
* Polygon creator class
* Developed by The Di Lab
* www.the-di-lab.com
* 22.06.2010
*/

// PolygonCreatorOptions added by John Snook as a hack to customize polygon creator class.
var PolygonCreatorOptions =
{
	icon: null, 		// MarkerImage object
	closed:function(){}	// Callback when user closes the polygon
}

function PolygonCreator(map)
{
	//create pen to draw on map
	this.map = map;
	this.pen = new Pen(this.map);
	var thisOjb=this;
	this.event=google.maps.event.addListener(thisOjb.map, 'click', function(event) { 
		thisOjb.pen.draw(event.latLng);
	});

	this.showData = function(){
		return this.pen.getData();
	}
	
	this.showColor = function(){
		return this.pen.getColor();
	}

	//destroy the pen
	this.destroy = function(){
		this.pen.deleteMis();
		if(null!=this.pen.polygon){
			this.pen.polygon.remove();
		}
		google.maps.event.removeListener(this.event);
	}
}	 
/*
* pen class
*/
function Pen(map)
{
	this.map= map;
	this.listOfDots = new Array();
	this.polyline =null;
	this.polygon = null;
	this.currentDot = null;
	//draw function
	this.draw = function(latLng){
		if (null != this.polygon) {
			alert('Click Reset to draw another');
		}else {
			if (this.currentDot != null && this.listOfDots.length > 1 && this.currentDot == this.listOfDots[0]) {
				this.drawPloygon(this.listOfDots);
			}else {
				//remove previous line
				if(null!=this.polyline){
					this.polyline.remove();
				}
				//draw Dot
				var dot = new Dot(latLng, this.map, this);
				this.listOfDots.push(dot);
				//draw line
				if(this.listOfDots.length > 1){
					this.polyline = new Line(this.listOfDots, this.map);
				}
			}
		}
	}
	
	//draw ploygon
	this.drawPloygon = function (listOfDots,color,des,id){
		this.polygon = new Polygon(listOfDots,this.map,this,color,des,id);
		this.deleteMis();
	}
	
	//delete all dots and polylines
	this.deleteMis = function(){
		//delete dots
		$.each(this.listOfDots, function(index, value){
			value.remove();
		});
		this.listOfDots.length=0;
		//delete lines
		if(null!=this.polyline){
			this.polyline.remove();
			this.polyline=null;
		}
	}
	
	//cancel
	this.cancel = function(){
		if(null!=this.polygon){
			(this.polygon.remove());
		}
		this.polygon=null;
		this.deleteMis();
		}
		//setter		
		this.setCurrentDot = function(dot){
		this.currentDot = dot;
	}
	
	//getter
	this.getListOfDots = function(){
		return this.listOfDots;
	}
	
	//get plots data
	this.getData = function(){
		if(this.polygon!=null){
			var data ="";
			var paths = this.polygon.getPlots();
			//get paths
			paths.getAt(0).forEach(function(value, index){
				data+=(value.toString());
			});
			return data;
		}else {
			return null;
		}
	}
	
	//get color
	this.getColor = function(){
		if(this.polygon!=null){
			var color = this.polygon.getColor();
			return color;
		}else {
			return null;
		}
	
	}
}

/* Child of Pen class
* dot class
*/
function Dot(latLng,map,pen){
	//property
	this.latLng=latLng;
	this.parent = pen;
	
	var markerOpts = {
	position: this.latLng, 
	map: map
	}
	
	if(PolygonCreatorOptions.icon)
		markerOpts.icon = PolygonCreatorOptions.icon;
	this.markerObj = new google.maps.Marker(markerOpts);
	
	//closure
	this.addListener = function(){
		var parent=this.parent;
		var thisMarker=this.markerObj;
		var thisDot=this;
		google.maps.event.addListener(thisMarker, 'click', function() { 
			parent.setCurrentDot(thisDot);
			parent.draw(thisMarker.getPosition());
		});				
	}	
	this.addListener();
	
	//getter 
	this.getLatLng = function(){
		return this.latLng;
	}
	
	this.getMarkerObj = function(){
		return this.markerObj;
	}
	
	this.remove = function(){
	this.markerObj.setMap(null);
	}
}

/* Child of Pen class
* Line class
*/
function Line(listOfDots,map){
	this.listOfDots = listOfDots;
	this.map = map;
	this.coords = new Array();
	this.polylineObj=null;
	
	if (this.listOfDots.length > 1) {
	var thisObj=this;
	$.each(this.listOfDots, function(index, value){
		thisObj.coords.push(value.getLatLng());
	});
	
	this.polylineObj  = new google.maps.Polyline({
	  path: this.coords,
	  strokeColor: "#FF0000",
	  strokeOpacity: 1.0,
	  strokeWeight: 2,
	  map: this.map
	});
	}
	
	this.remove = function(){
	this.polylineObj.setMap(null);
	}
}

/* Child of Pen class
* polygon class
*/
function Polygon(listOfDots,map,pen,color){
	this.listOfDots = listOfDots;
	this.map = map;
	this.coords = new Array();
	this.parent = pen;
	this.des = 'Hello';
	
	
	
	var thisObj=this;
	$.each(this.listOfDots,function(index,value){
		thisObj.coords.push(value.getLatLng());
	});
	
	this.polygonObj= new google.maps.Polygon({
		paths: this.coords,
		strokeColor: "#FF0000",
		strokeOpacity: 0.8,
		strokeWeight: 2,
		fillColor: "#FF0000",
		fillOpacity: 0.35,
		map:this.map
	});
	
	this.remove = function(){
		this.info.remove();
		this.polygonObj.setMap(null);
	}
	
	//getter
	this.getContent = function(){
		return this.des;
	}
	
	
	this.getPolygonObj= function(){
		return this.polygonObj;
	}
	
	this.getListOfDots = function (){
		return this.listOfDots;
	}
	
	this.getPlots = function(){
		return this.polygonObj.getPaths();
	}
	
	this.getColor=function(){
		return 	this.getPolygonObj().fillColor;
	}
	
	//setter
	this.setColor = function(color){
		return this.getPolygonObj().setOptions(
		{
			fillColor:color,
			strokeColor:color,
			strokeWeight: 2
		});
	}
	
	this.info = new Info(this,this.map);
	
	//closure		
	this.addListener = function(){
		var info=this.info;
		var thisPolygon=this.polygonObj;
		google.maps.event.addListener(thisPolygon, 'rightclick', function(event) { 					
			info.show(event.latLng);
		});
		if(PolygonCreatorOptions.closed) PolygonCreatorOptions.closed();
	}	
	this.addListener();
				  
}

/*
* Child of Polygon class
* Info Class
*/
function Info(polygon,map){
	this.parent = polygon;
	this.map = map;
	
	this.color =  document.createElement('input');
	
	this.button = document.createElement('input');
	$(this.button).attr('type','button');
	$(this.button).val("Change Color");
	var thisOjb=this;
	
	
	//change color action
	this.changeColor= function(){
		thisOjb.parent.setColor($(thisOjb.color).val());
	}
	
	//get content
	this.getContent = function(){
		var content = document.createElement('div');
		
		$(this.color).val(this.parent.getColor());	
		$(this.button).click(function(){
			thisObj.changeColor();
		});
		
		$(content).append(this.color);		
		$(content).append(this.button);
		return content;
	}
	
	thisObj=this;
	this.infoWidObj = new google.maps.InfoWindow({
		content:thisObj.getContent()
	});
	
	this.show = function(latLng){
		this.infoWidObj.setPosition(latLng);
		this.infoWidObj.open(this.map);
	}
	
	this.remove = function(){
		this.infoWidObj.close();
	}
}